﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OfficeOpenXml;
using Range = OfficeOpenXml.ExcelRange;

namespace 畜牧业审核程序国产.Models.PreReview
{
    internal class GoatAndSheep:Animal
    {
        public GoatAndSheep()
        {
            调查户编码所在行 = 4;
            调查户编码所在列 = 1;
            开始行 = 9;
            结束行 = 27;
            填报指标数量 = 19;
            村信息所在行 = 15;
            村信息所在列 = 2;
            Name = "羊";
            时点数结束行 = 13;
            TableName = "211";
        }
        public override string MandatoryReview(ExcelWorksheet sht)//强制性审核
        {
            base.本月及上季末月指标空值转成0并所有单元格全部居中(sht);
            base.本季度及上季度指标空值转成0(sht);
            base.恢复单元格颜色并删除注释(sht);
            var 户编码 = GetFarmCode(sht, 2, 1);

            for (int i = 3; i > 0; i--)//从这个季度的最左边的单元格开始
            {


                int 正在审核的列 = 本季度数据所在列 - i;
                Range rng月末存栏 = sht.Cells[开始行, 正在审核的列];
                Range rng月末山羊存栏 = sht.Cells[开始行 + 1, 正在审核的列]; ;
                Range rng月末能繁殖母山羊存栏 = sht.Cells[开始行 + 2, 正在审核的列];
                Range rng月末绵羊存栏 = sht.Cells[开始行 + 3, 正在审核的列];
                Range rng月末能繁殖母绵羊存栏 = sht.Cells[开始行 + 4, 正在审核的列];
                Range rng当月增加头数 = sht.Cells[开始行 + 5, 正在审核的列];
                Range rng当月自繁头数 = sht.Cells[开始行 + 6, 正在审核的列];
                Range rng当月自繁山羊头数 = sht.Cells[开始行 + 7, 正在审核的列];
                Range rng当月自繁绵羊头数 = sht.Cells[开始行 + 8, 正在审核的列];
                Range rng当月购进头数 = sht.Cells[开始行 + 9, 正在审核的列];
                Range rng当月购进山羊头数 = sht.Cells[开始行 + 10, 正在审核的列];
                Range rng当月购进绵羊头数 = sht.Cells[开始行 + 11, 正在审核的列];
                Range rng当月减少头数 = sht.Cells[开始行 + 12, 正在审核的列];
                Range rng当月自宰羊头数 = sht.Cells[开始行 + 13, 正在审核的列];
                Range rng当月出售羊头数 = sht.Cells[开始行 + 14, 正在审核的列];
                Range rng当月出售羊金额 = sht.Cells[开始行 + 15, 正在审核的列];
                Range rng当月出售羊重量 = sht.Cells[开始行 + 16, 正在审核的列];
                Range rng当月绵羊毛产量 = sht.Cells[开始行 + 17, 正在审核的列];
                Range rng当月山羊绒产量 = sht.Cells[开始行 + 18, 正在审核的列];

                #region 2.表内指标 ①　　期末存栏≠山羊+绵(湖)羊


                if (Convert.ToDouble(rng月末存栏.Value) != Convert.ToDouble(rng月末山羊存栏.Value) + Convert.ToDouble(rng月末绵羊存栏.Value))
                {
                    string 提示信息 = "期末存栏应该等于山羊数与绵(湖)羊存栏数之和!";
                    //List<Range> rngs = new List<Range>() { rng本月期末存栏, rng25公斤以下仔猪存栏, rng种猪存栏, rng待育肥猪存栏 };
                    //foreach (var rng in rngs)
                    //{
                    //    rng.Interior.ColorIndex = 3;
                    //    rng.AddComment(提示信息);
                    //}
                    Range[] ranges = new Range[] { rng月末存栏, rng月末山羊存栏, rng月末绵羊存栏 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                }
                #endregion
                #region ② 　山羊期末存栏<能繁殖母山羊数量

                if (Convert.ToDouble(rng月末山羊存栏.Value) < Convert.ToDouble(rng月末能繁殖母山羊存栏.Value))
                {
                    string 提示信息 = "期末存栏山羊数量应大于等于能繁殖母山羊数量";
                    Range[] ranges = new Range[] { rng月末山羊存栏, rng月末能繁殖母山羊存栏 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                }
                #endregion
                #region ③　绵(湖)羊期末存栏<能繁殖母绵(湖)羊

                if (Convert.ToDouble(rng月末绵羊存栏.Value) < Convert.ToDouble(rng月末能繁殖母绵羊存栏.Value))
                {
                    string 提示信息 = "期末存栏绵(湖)羊数量应大于等于能繁殖母绵(湖)羊数量";
                    Range[] rngs = new Range[] { rng月末绵羊存栏, rng月末能繁殖母绵羊存栏 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, rngs);

                }


                #endregion
                #region ④期内增加!=自繁+购进

                if (Convert.ToDouble(rng当月增加头数.Value) != Convert.ToDouble(rng当月自繁头数.Value) + Convert.ToDouble(rng当月购进头数.Value))
                {
                    string 提示信息 = "期内增加数量应等于自繁、购进之和";
                    Range[] ranges = new Range[] { rng当月增加头数, rng当月自繁头数, rng当月购进头数 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                }
                #endregion
                #region ⑤　　自繁头数≠自繁山羊+自繁绵(湖)羊

                if (Convert.ToDouble(rng当月自繁头数.Value) != Convert.ToDouble(rng当月自繁山羊头数.Value) + Convert.ToDouble(rng当月自繁绵羊头数.Value))
                {
                    string 提示信息 = "期内增加的自繁羊数量应等于自繁山羊与自繁绵(湖)羊之和";
                    Range[] ranges = new Range[] { rng当月自繁头数, rng当月自繁山羊头数, rng当月自繁绵羊头数 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                }

                #endregion
                #region ⑥　　购进头数≠购进山羊+购进绵(湖)羊

                if (Convert.ToDouble(rng当月购进头数.Value) != Convert.ToDouble(rng当月购进山羊头数.Value) + Convert.ToDouble(rng当月购进绵羊头数.Value))
                {
                    string 提示信息 = "期内增加购进数量应等于购进山羊与自繁绵(湖)羊之和";
                    Range[] ranges = new Range[] { rng当月购进头数, rng当月购进山羊头数, rng当月购进绵羊头数 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                }
                #endregion
                #region ⑦期内减少头数<自宰羊数量+出售羊数量

                //if ((double)rng当月出售头数.Value == 0 && ((double)rng当月出售肥猪金额.Value != 0 || (double)rng当月出售肥猪重量.Value != 0))
                if (Convert.ToDouble(rng当月减少头数.Value) < Convert.ToDouble(rng当月自宰羊头数.Value) + Convert.ToDouble(rng当月出售羊头数.Value))
                {
                    //string 提示信息 = "若出售肥猪头数为0，那么出售肥猪金额、重量均应为0";
                    string 提示信息 = "期内减少数量应大于等于自宰羊数量加出售羊数量之和";
                    Range[] ranges = new Range[] { rng当月减少头数, rng当月自宰羊头数, rng当月出售羊头数 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                }
                #endregion
                #region ⑧　若有出售羊,则出售羊头数、金额、重量至少有一个未填

                if (Convert.ToDouble(rng当月出售羊头数.Value) + Convert.ToDouble(rng当月出售羊重量.Value) + Convert.ToDouble(rng当月出售羊金额.Value) > 0 &&
                    Convert.ToDouble(rng当月出售羊头数.Value) * Convert.ToDouble(rng当月出售羊重量.Value) * Convert.ToDouble(rng当月出售羊金额.Value) == 0)
                {
                    string 提示信息 = "若有出售羊,则出售羊头数、金额、重量至少有一个未填";
                    Range[] ranges = new Range[] { rng当月出售羊头数, rng当月出售羊重量, rng当月出售羊金额 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);

                }
                #endregion


                #region 1.月度间平衡 本月存栏 !=上月末存栏+本月期内增加-本月期内减少

                if (i != 3)
                {
                    Range rng上月末存栏 = sht.Cells[开始行, 本季度数据所在列 - (i + 1)];
                    if (Convert.ToDouble(rng月末存栏.Value) != Convert.ToDouble(rng上月末存栏.Value) +
                        Convert.ToDouble(rng当月增加头数.Value) - Convert.ToDouble(rng当月减少头数.Value))
                    {
                        string 提示信息 = "本月存栏应等于上月末存栏+本月期内增加-本月期内减少";
                        Range[] ranges = new Range[] { rng上月末存栏, rng月末存栏, rng当月增加头数, rng当月减少头数 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                    }
                }
                else if (_seasonNow != 1)
                {
                    Range rng上月末存栏 = sht.Cells[开始行, 本季度数据所在列 - (i + 2)]; //上个季度的月末数据要往前再退一列
                    if (Convert.ToDouble(rng月末存栏.Value) != Convert.ToDouble(rng上月末存栏.Value) +
                        Convert.ToDouble(rng当月增加头数.Value) - Convert.ToDouble(rng当月减少头数.Value))
                    {
                        string 提示信息 = "本月存栏应等于上月末存栏+本月期内增加-本月期内减少";
                        Range[] ranges = new Range[] { rng上月末存栏, rng月末存栏, rng当月增加头数, rng当月减少头数 };
                        base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                    }
                }
                else//一季度的上月情况
                {
                    try
                    {
                        MyDBOperator dBOperator = MyDBOperator.DBOperatorInstance;
                        string sqlToGet上月末存栏数据 = $"select 期末存栏合计01  from 统计云{_yearNow.ToString()}年第四季度A209 where 户编码 = '{户编码}'";

                        double 上月末存栏数据 = Convert.ToDouble(dBOperator.GetDataTable(sqlToGet上月末存栏数据).Rows[0][0]);
                        if (Convert.ToDouble(rng月末存栏.Value) != 上月末存栏数据 +
                            Convert.ToDouble(rng当月增加头数.Value) - Convert.ToDouble(rng当月减少头数.Value))
                        {
                            string 提示信息 = $"本月存栏应等于上月末存栏+本月期内增加-本月期内减少,去年年末数据为{上月末存栏数据.ToString()}";
                            Range[] ranges = new Range[] { rng月末存栏, rng当月增加头数, rng当月减少头数 };
                            base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                        }
                    }
                    catch (Exception ex)
                    {
                        //MyMessagebox.Show(ex.Message)
                        //throw;
                        return "本地数据未导入上一年第四季度数据";
                    }
                }
            }
                #endregion
                //季度强制性审核
                Range rng季末存栏 = sht.Cells[开始行, 本季度数据所在列];
                Range rng季末山羊存栏 = sht.Cells[开始行 + 1, 本季度数据所在列]; ;
                Range rng季末能繁殖母山羊存栏 = sht.Cells[开始行 + 2, 本季度数据所在列];
                Range rng季末绵羊存栏 = sht.Cells[开始行 + 3, 本季度数据所在列];
                Range rng季末能繁殖母绵羊存栏 = sht.Cells[开始行 + 4, 本季度数据所在列];
                Range rng当季增加头数 = sht.Cells[开始行 + 5, 本季度数据所在列];
                Range rng当季自繁头数 = sht.Cells[开始行 + 6, 本季度数据所在列];
                Range rng当季自繁山羊头数 = sht.Cells[开始行 + 7, 本季度数据所在列];
                Range rng当季自繁绵羊头数 = sht.Cells[开始行 + 8, 本季度数据所在列];
                Range rng当季购进头数 = sht.Cells[开始行 + 9, 本季度数据所在列];
                Range rng当季购进山羊头数 = sht.Cells[开始行 + 10, 本季度数据所在列];
                Range rng当季购进绵羊头数 = sht.Cells[开始行 + 11, 本季度数据所在列];
                Range rng当季减少头数 = sht.Cells[开始行 + 12, 本季度数据所在列];
                Range rng当季自宰羊头数 = sht.Cells[开始行 + 13, 本季度数据所在列];
                Range rng当季出售羊头数 = sht.Cells[开始行 + 14, 本季度数据所在列];
                Range rng当季出售羊金额 = sht.Cells[开始行 + 15, 本季度数据所在列];
                Range rng当季出售羊重量 = sht.Cells[开始行 + 16, 本季度数据所在列];
                Range rng当季绵羊毛产量 = sht.Cells[开始行 + 17, 本季度数据所在列];
                Range rng当季山羊绒产量 = sht.Cells[开始行 + 18, 本季度数据所在列];
                #region 2.表内指标 ①　　期末存栏≠山羊+绵(湖)羊


                if (Convert.ToDouble (rng季末存栏.Value) != Convert.ToDouble(rng季末山羊存栏.Value) + Convert.ToDouble(rng季末绵羊存栏.Value))
                {
                    string 提示信息 = "期末存栏应该等于山羊数与绵(湖)羊存栏数之和!";

                    Range[] ranges = new Range[] { rng季末存栏, rng季末山羊存栏, rng季末绵羊存栏 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region ② 　山羊期末存栏<能繁殖母山羊数量

                if (Convert.ToDouble(rng季末山羊存栏.Value) < Convert.ToDouble(rng季末能繁殖母山羊存栏.Value))
                {
                    string 提示信息 = "期末存栏山羊数量应大于等于能繁殖母山羊数量";
                    Range[] ranges = new Range[] { rng季末山羊存栏, rng季末能繁殖母山羊存栏 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region ③　绵(湖)羊期末存栏<能繁殖母绵(湖)羊

                if (Convert.ToDouble(rng季末绵羊存栏.Value) < Convert.ToDouble(rng季末能繁殖母绵羊存栏.Value))
                {
                    string 提示信息 = "期末存栏绵(湖)羊数量应大于等于能繁殖母绵(湖)羊数量";
                    Range[] rngs = new Range[] { rng季末绵羊存栏, rng季末能繁殖母绵羊存栏 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, rngs);
                    
                }


                #endregion
                #region ④期内增加!=自繁+购进

                if (Convert.ToDouble(rng当季增加头数.Value) != Convert.ToDouble(rng当季自繁头数.Value) + Convert.ToDouble(rng当季购进头数.Value))
                {
                    string 提示信息 = "期内增加数量应等于自繁、购进之和";
                    Range[] ranges = new Range[] { rng当季增加头数, rng当季自繁头数, rng当季购进头数 };
                    base.错误单元格标注成红色并加注释(提示信息, sht, ranges);
                    
                }
                #endregion
                #region ⑤　　自繁头数≠自繁山羊+自繁绵(湖)羊

                if (Convert.ToDouble(rng当季自繁头数.Value) != Convert.ToDouble(rng当季自繁山羊头数.Value) + Convert.ToDouble(rng当季自繁绵羊头数.Value))
                {
                    string 提示信息 = "期内增加的自繁羊数量应等于自繁山羊与自繁绵(湖)羊之和";
                    Range[] ranges = new Range[] { rng当季自繁头数, rng当季自繁山羊头数, rng当季自繁绵羊头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }

                #endregion
                #region ⑥　　购进头数≠购进山羊+购进绵(湖)羊

                if (Convert.ToDouble(rng当季购进头数.Value) < Convert.ToDouble(rng当季购进山羊头数.Value) + Convert.ToDouble(rng当季购进绵羊头数.Value))
                {
                    string 提示信息 = "期内增加购进数量应等于购进山羊与自繁绵(湖)羊之和";
                    Range[] ranges = new Range[] { rng当季购进头数, rng当季购进山羊头数, rng当季购进绵羊头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region ⑦期内减少头数<自宰羊数量+出售羊数量


                if (Convert.ToDouble(rng当季减少头数.Value) < Convert.ToDouble(rng当季自宰羊头数.Value) + Convert.ToDouble(rng当季出售羊头数.Value))
                {
                    //string 提示信息 = "若出售肥猪头数为0，那么出售肥猪金额、重量均应为0";
                    string 提示信息 = "期内减少数量应大于等于自宰羊数量加出售羊数量之和";
                    Range[] ranges = new Range[] { rng当季减少头数, rng当季自宰羊头数, rng当季出售羊头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion
                #region ⑧　若有出售羊,则出售羊头数、金额、重量至少有一个未填

                if (Convert.ToDouble(rng当季出售羊头数.Value) + Convert.ToDouble(rng当季出售羊重量.Value) + Convert.ToDouble(rng当季出售羊金额.Value) > 0 &&
                    Convert.ToDouble(rng当季出售羊头数.Value) * Convert.ToDouble(rng当季出售羊重量.Value) * Convert.ToDouble(rng当季出售羊金额.Value) == 0)
                {
                    string 提示信息 = "若有出售羊,则出售羊头数、金额、重量至少有一个未填";
                    Range[] ranges = new Range[] { rng当季出售羊头数, rng当季出售羊重量, rng当季出售羊金额 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }
                #endregion


                #region 1.季度间平衡 本季存栏 !=上季末存栏+本季期内增加-本季期内减少



                Range rng上季末存栏 = sht.Cells[开始行, 上季度数据所在列];


                if (Convert.ToDouble(rng季末存栏.Value) != Convert.ToDouble(rng上季末存栏.Value) + Convert.ToDouble(rng当季增加头数.Value) - Convert.ToDouble(rng当季减少头数.Value))
                {
                    string 提示信息 = "本季存栏应等于上季末存栏+本季期内增加-本季期内减少";
                    Range[] ranges = new Range[] { rng上季末存栏, rng季末存栏, rng当季增加头数, rng当季减少头数 };
                    base.错误单元格标注成红色并加注释(提示信息,sht, ranges);
                    
                }

                #endregion

                return "无错误";
        }
        

        public override void VerificationReview(ExcelWorksheet sht)//核实性审核
        {
            核实性说明标题填写(sht);
            List<string> ListSTR_核实性错误内容 = new List<string>();
            //接下去先审核,并把错误写到一个集合中或字典中
            //月度的核实性审核
            for (int i = 3; i > 0; i--)//从这个季度的最左边的单元格开始
            {

                int 正在审核的列 = 本季度数据所在列 - i;
                Range rng月末存栏 = sht.Cells[开始行, 正在审核的列];
                Range rng月末山羊存栏 = sht.Cells[开始行 + 1, 正在审核的列]; ;
                Range rng月末能繁殖母山羊存栏 = sht.Cells[开始行 + 2, 正在审核的列];
                Range rng月末绵羊存栏 = sht.Cells[开始行 + 3, 正在审核的列];
                Range rng月末能繁殖母绵羊存栏 = sht.Cells[开始行 + 4, 正在审核的列];
                Range rng当月增加头数 = sht.Cells[开始行 + 5, 正在审核的列];
                Range rng当月自繁头数 = sht.Cells[开始行 + 6, 正在审核的列];
                Range rng当月自繁山羊头数 = sht.Cells[开始行 + 7, 正在审核的列];
                Range rng当月自繁绵羊头数 = sht.Cells[开始行 + 8, 正在审核的列];
                Range rng当月购进头数 = sht.Cells[开始行 + 9, 正在审核的列];
                Range rng当月购进山羊头数 = sht.Cells[开始行 + 10, 正在审核的列];
                Range rng当月购进绵羊头数 = sht.Cells[开始行 + 11, 正在审核的列];
                Range rng当月减少头数 = sht.Cells[开始行 + 12, 正在审核的列];
                Range rng当月自宰羊头数 = sht.Cells[开始行 + 13, 正在审核的列];
                Range rng当月出售羊头数 = sht.Cells[开始行 + 14, 正在审核的列];
                Range rng当月出售羊金额 = sht.Cells[开始行 + 15, 正在审核的列];
                Range rng当月出售羊重量 = sht.Cells[开始行 + 16, 正在审核的列];
                Range rng当月绵羊毛产量 = sht.Cells[开始行 + 17, 正在审核的列];
                Range rng当月山羊绒产量 = sht.Cells[开始行 + 18, 正在审核的列];



                #region  ①出栏头重偏小

                if (Convert.ToDouble( rng当月出售羊头数.Value) > 0 && Convert.ToDouble(rng当月出售羊重量.Value) / Convert.ToDouble(rng当月出售羊头数.Value) < 20)
                {
                    string 错误描述 = $"[月度错误]出栏头重偏小,不足20公斤,小羊若是卖掉别人继续养不算出售:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出栏数为{rng当月出售羊头数.Value.ToString()}头,重量为{rng当月出售羊重量.Value.ToString()}公斤,平均头重为{Convert.ToString(Math.Round((double)rng当月出售羊重量.Value / (double)rng当月出售羊头数.Value, 2))}公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ②出栏头重过高

                if (Convert.ToDouble(rng当月出售羊头数.Value) > 0 && Convert.ToDouble(rng当月出售羊重量.Value) / Convert.ToDouble(rng当月出售羊头数.Value) > 80)
                {
                    string 平均头重 = (Convert.ToDouble(rng当月出售羊重量.Value) / Convert.ToDouble(rng当月出售羊头数.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]出栏头重偏大,超过80公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出栏数为{rng当月出售羊头数.Value.ToString()}头,重量为{rng当月出售羊重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ③平均单价过低

                if (Convert.ToDouble(rng当月出售羊头数.Value) > 0 && Convert.ToDouble(rng当月出售羊金额.Value) / Convert.ToDouble(rng当月出售羊重量.Value) < 20)
                {
                    string 平均单价 = (Convert.ToDouble(rng当月出售羊金额.Value) / Convert.ToDouble(rng当月出售羊重量.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]平均单价过低,不足20元/公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出售金额为{rng当月出售羊金额.Value.ToString()}元,重量为{rng当月出售羊重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region  ④平均单价过高

                if (Convert.ToDouble(rng当月出售羊头数.Value) > 0 && Convert.ToDouble(rng当月出售羊金额.Value) / Convert.ToDouble(rng当月出售羊重量.Value) > 60)
                {
                    string 平均单价 = (Convert.ToDouble(rng当月出售羊金额.Value) / Convert.ToDouble(rng当月出售羊重量.Value)).ToString("F2");
                    string 错误描述 = $"[月度错误]平均单价过高,超过60元/公斤:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}出售金额为{rng当月出售羊金额.Value.ToString()}元,重量为{rng当月出售羊重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }

                #endregion
                #region ⑤　绵羊毛产量≠0。某些地区这里要不要设置不审?
                if (Convert.ToDouble(rng当月绵羊毛产量.Value) > 0)
                {

                    string 错误描述 = $"[月度错误]绵羊毛一般为0,请核实:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}绵羊毛产量为{rng当月绵羊毛产量.Value}";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }
                #endregion
                #region ⑥⑥　山羊绒产量≠0 某些地区这里要不要设置不审?
                if (Convert.ToDouble( rng当月山羊绒产量.Value) > 0)
                {
                    string 错误描述 = $"[月度错误]山羊绒一般为0,请核实:";
                    string 具体错误 = $"{sht.Cells[开始行 - 2, 正在审核的列].Value.ToString()}山羊绒产量为{rng当月山羊绒产量.Value}";
                    ListSTR_核实性错误内容.Add(错误描述 + 具体错误);
                }
                #endregion


            }

            //季度的
            List<string> ListSTR_季度核实性错误内容 = new List<string>();

            Range rng季末存栏 = sht.Cells[开始行, 本季度数据所在列];
            Range rng季末山羊存栏 = sht.Cells[开始行 + 1, 本季度数据所在列]; ;
            Range rng季末能繁殖母山羊存栏 = sht.Cells[开始行 + 2, 本季度数据所在列];
            Range rng季末绵羊存栏 = sht.Cells[开始行 + 3, 本季度数据所在列];
            Range rng季末能繁殖母绵羊存栏 = sht.Cells[开始行 + 4, 本季度数据所在列];
            Range rng当季增加头数 = sht.Cells[开始行 + 5, 本季度数据所在列];
            Range rng当季自繁头数 = sht.Cells[开始行 + 6, 本季度数据所在列];
            Range rng当季自繁山羊头数 = sht.Cells[开始行 + 7, 本季度数据所在列];
            Range rng当季自繁绵羊头数 = sht.Cells[开始行 + 8, 本季度数据所在列];
            Range rng当季购进头数 = sht.Cells[开始行 + 9, 本季度数据所在列];
            Range rng当季购进山羊头数 = sht.Cells[开始行 + 10, 本季度数据所在列];
            Range rng当季购进绵羊头数 = sht.Cells[开始行 + 11, 本季度数据所在列];
            Range rng当季减少头数 = sht.Cells[开始行 + 12, 本季度数据所在列];
            Range rng当季自宰羊头数 = sht.Cells[开始行 + 13, 本季度数据所在列];
            Range rng当季出售羊头数 = sht.Cells[开始行 + 14, 本季度数据所在列];
            Range rng当季出售羊金额 = sht.Cells[开始行 + 15, 本季度数据所在列];
            Range rng当季出售羊重量 = sht.Cells[开始行 + 16, 本季度数据所在列];
            Range rng当季绵羊毛产量 = sht.Cells[开始行 + 17, 本季度数据所在列];
            Range rng当季山羊绒产量 = sht.Cells[开始行 + 18, 本季度数据所在列];


            #region  ①出栏头重偏小

            if (Convert.ToDouble( rng当季出售羊头数.Value) > 0 && Convert.ToDouble(rng当季出售羊重量.Value) / Convert.ToDouble(rng当季出售羊头数.Value) < 20)
            {
                string 错误描述 = $"[季度错误]出栏头重偏小,不足20公斤:";
                string 具体错误 = $"出栏数为{rng当季出售羊头数.Value.ToString()}头,重量为{rng当季出售羊重量.Value.ToString()}公斤,平均头重为{Convert.ToString(Math.Round((double)rng当季出售羊重量.Value / (double)rng当季出售羊头数.Value, 2))}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ②出栏头重过高

            if (Convert.ToDouble(rng当季出售羊头数.Value) > 0 && Convert.ToDouble(rng当季出售羊重量.Value) / Convert.ToDouble(rng当季出售羊头数.Value) > 80)
            {
                string 平均头重 = (Convert.ToDouble(rng当季出售羊重量.Value) / Convert.ToDouble(rng当季出售羊头数.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]出栏头重偏大,超过80公斤:";
                string 具体错误 = $"出栏数为{rng当季出售羊头数.Value.ToString()}头,重量为{rng当季出售羊重量.Value.ToString()}公斤,平均头重为{平均头重}公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ③平均单价过低

            if (Convert.ToDouble(rng当季出售羊头数.Value) > 0 && Convert.ToDouble(rng当季出售羊金额.Value) / Convert.ToDouble(rng当季出售羊重量.Value) < 20)
            {
                string 平均单价 = (Convert.ToDouble(rng当季出售羊金额.Value) / Convert.ToDouble(rng当季出售羊重量.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]平均单价过低,不足20元/公斤:";
                string 具体错误 = $"出售金额为{rng当季出售羊金额.Value.ToString()}元,重量为{rng当季出售羊重量.Value.ToString()}公斤,平均单价为{平均单价}元/公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region  ④平均单价过高

            if (Convert.ToDouble(rng当季出售羊头数.Value) > 0 && Convert.ToDouble(rng当季出售羊金额.Value) / Convert.ToDouble(rng当季出售羊重量.Value) > 60)
            {
                string 平均单价 = (Convert.ToDouble(rng当季出售羊金额.Value) / Convert.ToDouble(rng当季出售羊重量.Value)).ToString("F2");
                string 错误描述 = $"[季度错误]平均单价过高,超过60元/公斤:";
                string 具体错误 = $"出售金额为{rng当季出售羊金额.Value.ToString()},重量为{rng当季出售羊重量.Value.ToString()},平均单价为{平均单价}元/公斤";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }

            #endregion
            #region ⑤　绵羊毛产量≠0。
            if (Convert.ToDouble(rng当季绵羊毛产量.Value) > 0)
            {

                string 错误描述 = $"[季度错误]绵羊毛一般为0,请核实:";
                string 具体错误 = $"本季度绵羊毛产量为{rng当季绵羊毛产量.Value}";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region ⑥　山羊绒产量≠0
            if (Convert.ToDouble(rng当季山羊绒产量.Value) > 0)
            {
                string 错误描述 = $"[季度错误]山羊绒一般为0,请核实:";
                string 具体错误 = $"本季度山羊绒产量为{rng当季山羊绒产量.Value}";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region ⑦　如果本季自繁山羊>0，上季能繁殖母山羊存栏=0。
            Range rng上季末能繁殖母山羊存栏 = sht.Cells[开始行 + 2, 上季度数据所在列];
            if (Convert.ToDouble(rng当季自繁山羊头数.Value) > 0 && Convert.ToDouble(rng上季末能繁殖母山羊存栏.Value) == 0)
            {

                string 错误描述 = $"[季度错误]本季有山羊自繁，上季度末却没有能繁殖母山羊，是否填错请核实:";
                string 具体错误 = $"本季度自繁山羊为{rng当季自繁山羊头数.Value.ToString()}头,上季度能繁殖母山羊为0";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region ⑧　如果本季自繁绵(湖)羊>0，上季能繁殖母绵(湖)羊存栏=0
            Range rng上季末能繁殖母绵羊存栏 = sht.Cells[开始行 + 4, 上季度数据所在列];
            if (Convert.ToDouble(rng当季自繁绵羊头数.Value) > 0 && Convert.ToDouble(rng上季末能繁殖母绵羊存栏.Value) == 0)
            {

                string 错误描述 = $"[季度错误]本季有绵羊自繁，上季度末却没有能繁殖母绵羊，是否填错请核实:";
                string 具体错误 = $"本季度自繁绵羊为{rng当季自繁绵羊头数.Value.ToString()}头,上季度能繁殖母绵羊为0";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region ⑨　如果本季自繁山羊>0，本季能繁殖母山羊存栏=0
            if (Convert.ToDouble(rng当季自繁山羊头数.Value) > 0 && Convert.ToDouble(rng季末能繁殖母山羊存栏.Value) == 0)
            {

                string 错误描述 = $"[季度错误]本季有山羊自繁，本季度末却没有能繁殖母山羊，是否填错请核实:";
                string 具体错误 = $"本季度自繁山羊为{rng当季自繁山羊头数.Value.ToString()}头,本季度能繁殖母山羊为{rng季末能繁殖母山羊存栏.Value}头";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            #region ⑩　如果本季自繁绵(湖)羊>0，本季能繁殖母绵(湖)羊存栏=0
            if (Convert.ToDouble(rng当季自繁绵羊头数.Value) > 0 && Convert.ToDouble(rng季末能繁殖母绵羊存栏.Value) == 0)
            {

                string 错误描述 = $"[季度错误]本季有绵羊自繁，本季度末却没有能繁殖母绵羊，是否填错请核实:";
                string 具体错误 = $"本季度自繁绵羊为{rng当季自繁绵羊头数.Value.ToString()}头,本季度能繁殖母绵羊为{rng季末能繁殖母绵羊存栏.Value}头";
                ListSTR_季度核实性错误内容.Add(错误描述 + 具体错误);
            }
            #endregion
            ListSTR_核实性错误内容.AddRange(ListSTR_季度核实性错误内容);
            base.核实数据输出至台账(ListSTR_核实性错误内容, sht);


        }
    }
}
